package com.itany.corejava.code16_反射;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Miss Chen
 * @version 1.0
 * @date 2024年08月13日9:16
 */
public class EmpFactoryMap {
    private static Map<String,String> map;
    static{
        map=new HashMap<>();

        try {
            BufferedReader br=new BufferedReader(new InputStreamReader(
                    EmpFactoryMap.class.getClassLoader().getResourceAsStream("emp.properties")));
            String line=null;
           while((line=br.readLine())!=null){
               // 开发中，配置文件中可能会存在空行，对于空行，不进行处理，直接读取下一行即可，当line的取值为"",表示空行
               if(!"".equals(line)){
                   String[] arr=line.split("=");
                   map.put(arr[0],arr[1]);
               }
           }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static Emp getEmp() throws EmpCreateFailException {

        try {
            Class<Emp> c=Emp.class;

            //通过Class对象获取对应类的午餐构造方法创建对象
            Emp emp=c.newInstance();
            //获取Emo对象中所有的属性
            Field[] fields=c.getDeclaredFields();
            for(Field field:fields){

                //获取对应属性上的Value注解
                Value annotation= field.getAnnotation(Value.class);

                //将注解的值作为properties中的key
                String key=annotation.value();

                //根据key获取map集合中对应的取值
                String val=map.get(key);

                //取消权限控制检查
                field.setAccessible(true);

                //为属性赋值
                field.set(emp,val);
            }
            return emp;

        } catch (InstantiationException e) {
            e.printStackTrace();
            throw new EmpCreateFailException("创建Emp失败");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            throw new EmpCreateFailException("创建Emp失败");
        }


    }


}
